/*
 * FileName: myfunction.cc
 * Author: 李波(Edwin Lee)
 * Date: 2024-07-14 16:15:26
 * Version: 1.0
 * Description:函数对象std::function的实现原理,模拟实现一个简易的函数对象
 */
#include <iostream>
using namespace std;

//函数对象的模板
template<typename Fty>
class myfunction{};

/*
template<typename R, typename A>
class myfunction<R(A)>
{
public:
	using PFUNC = R(*)(A);
	myfunction(PFUNC pfunc):pfunc_(pfunc){}
	R operator()(A arg)
	{
		return pfunc_(arg);
	}

private:
	PFUNC pfunc_;
};
*/

//不定参数的部分特例化模板
template<typename R, typename... A>
class myfunction<R(A...)>
{
public:
	using PFUNC = R(*)(A...);
	myfunction(PFUNC pfunc):pfunc_(pfunc){}
	R operator()(A... arg)
	{
		return pfunc_(arg...);
	}

private:
	PFUNC pfunc_;
};


void hello(string str){cout<<str<<endl;}

int main()
{
	myfunction<void(string)> func1(hello);
	func1("hello world");
	return 0;
}
